package com.witmore.neutron.ai.cognitive.dto;

import com.witmore.neutron.ai.db.entity.ModelConfigDO;
import lombok.Data;
import lombok.Builder;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

/**
 * 会话扣减请求参数
 * 用于封装扣减用户会话次数的所有参数，避免方法参数过多
 *
 * @author 豆子高
 * @since 2025-01-15
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SessionDeductionRequest {

    /**
     * 用户ID
     */
    private Integer userId;

    /**
     * 模型配置信息
     */
    private ModelConfigDO modelConfigDO;

    /**
     * 会话ID
     */
    private String sessionId;

    /**
     * 智能助手ID
     */
    private Integer agentId;

    /**
     * 工具回调信息（用于生成插件JSON）
     */
    private Object toolCallbacks;

    /**
     * 用户API密钥
     */
    private String userApiKey;

    /**
     * 服务商ID（可选）
     */
    private Integer providerId;

    /**
     * 使用的输入Token数（可选，用于统计）
     */
    private Integer usageTokensIn;

    /**
     * 使用的输出Token数（可选，用于统计）
     */
    private Integer usageTokensOut;

    /**
     * 使用的总Token数（可选，用于统计）
     */
    private Integer usageTotalTokens;

    private String rowMetadataId;

    /**
     * 创建便捷的构建方法
     *
     * @param userId 用户ID
     * @param modelConfigDO 模型配置
     * @param sessionId 会话ID
     * @return SessionDeductionRequest
     */
    public static SessionDeductionRequest of(Integer userId, ModelConfigDO modelConfigDO, String sessionId) {
        return SessionDeductionRequest.builder()
                .userId(userId)
                .modelConfigDO(modelConfigDO)
                .sessionId(sessionId)
                .build();
    }

    /**
     * 创建完整信息的构建方法
     *
     * @param userId 用户ID
     * @param modelConfigDO 模型配置
     * @param sessionId 会话ID
     * @param agentId 智能助手ID
     * @param toolCallbacks 工具回调
     * @param userApiKey 用户API密钥
     * @return SessionDeductionRequest
     */
    public static SessionDeductionRequest of(Integer userId, ModelConfigDO modelConfigDO, String sessionId,
                                           Integer agentId, Object toolCallbacks, String userApiKey) {
        return SessionDeductionRequest.builder()
                .userId(userId)
                .modelConfigDO(modelConfigDO)
                .sessionId(sessionId)
                .agentId(agentId)
                .toolCallbacks(toolCallbacks)
                .userApiKey(userApiKey)
                .build();
    }
}
